package trial.bishi2023;

import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class MeiTuan {
    public static void main(String[] args) {
        problem2();
    }


    public static void problem1() {
        Scanner sc = new Scanner(System.in);
        StringBuilder number = new StringBuilder(sc.nextLine());
        int ans = 0;
        for (int i = 0; i < number.length() - 1; i++) {
            if (number.charAt(i + 1) == number.charAt(i)) {
                number.replace(i + 1, i + 2, "$");
                ans++;
            }
        }
//        System.out.println(number.toString());
        System.out.println(ans);
    }

    /**
     * 小美是一位天文爱好者，她收集了接下来一段时间中所有会划过她所在的观测地上空的流星信息。
     * 具体地，她收集了n个流星在她所在观测地上空的出现时刻和消失时刻。对于一个流星，
     * 若其的出现时刻为s，消失时刻为t，那么小美在时间段[s, t]都能够观测到它。
     * 对于一个时刻，观测地上空出现的流星数量越多，则小美认为该时刻越好。小美希望能够选择一个最佳的时刻进行观测和摄影，
     * 使她能观测到最多数量的流星。现在小美想知道，在这个最佳时刻，她最多能观测到多少个流星以及一共有多少个最佳时刻可供她选择。
     * 第一行是一个正整数n，表示流星的数量。
     * 第二行是n个用空格隔开的正整数，第i个数si表示第i个流星的出现时间。
     * 第三行是n个用空格隔开的正整数，第i个数ti表示第i个流星的消失时间。
     * 1<=n<=100000, 1<=si<=ti<=10^9
     *
     * 样例输入
     * 3
     * 2 1 5
     * 6 3 7
     *
     * 样例输出
     * 2 4
     */

    /**
     *
     * 应使用《差分数组》方法处理
     *
     */
    public static void problem2() {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(),latest=0;
        int[] start = new int[n];
        int[] end = new int[n];
        for (int i = 0; i < n; i++) {start[i] = sc.nextInt();}
        for (int i = 0; i < n; i++) {
            end[i] = sc.nextInt();
            latest = Math.max(latest, end[i]);
        }
        System.out.println(Arrays.toString(start));
        System.out.println(Arrays.toString(end));
        System.out.println(latest);

        int[] buff = new int[latest + 2];
        for (int i = 0; i < n; i++) {
            buff[start[i]]++;
            buff[end[i]+1]--;
        }
        System.out.println("差分前: "+Arrays.toString(buff));
        int MAX=0,MAXTIME=0,sum=0;
        for (int i = 1; i < latest+1; i++) {
            sum+=buff[i];
            MAX=Math.max(MAX,sum);
            buff[i]=sum;
        }
        System.out.println("差分后: "+Arrays.toString(buff));
        for (int i = 0; i < latest+1; i++) {
            MAXTIME=buff[i]==MAX?MAXTIME+1:MAXTIME;
        }
        System.out.println("正确解法:\n"+MAX+" "+MAXTIME);

        int[] lib = new int[latest + 1];
        for (int i = 0; i < n; i++) {
            for (int j = start[i]; j <= end[i]; j++) {
                ++lib[j];
            }
        }
        System.out.println(Arrays.toString(lib));
        int max = 0, maxTime = 0;
        for (int i: lib) {
            max=Math.max(max,i);
        }
        for (int i : lib) {
            if (i == max) {
                maxTime++;
            }
        }
        System.out.println(max + " " + maxTime);
    }
    //        while(maxTimeTag<latest&&buff[maxTimeTag]==buff[maxTimeTag+1]){
//            maxTime++;
//            maxTimeTag++;
//        } 此版本为连续时长
}
